package main

import "fmt"

// 切片
func main() {
	// 定义切片
	var s1 []int
	fmt.Printf("s1: %v type:%T\n", s1, s1) // s1: [] type:[]int
	// 未初始化的切片为空 nil
	fmt.Println(s1 == nil) // true

	// 初始化
	var s2 = []string{"aa", "bb"}
	fmt.Printf("s2: %v type:%T\n", s2, s2) // s2: [aa bb] type:[]string

	// 切片的容量和长度
	var s3 = []string{"aa", "bb", "世界很大"}
	fmt.Println("s2 len = ", len(s3))
	fmt.Println("s2 cap = ", cap(s3))

	// 数组定义切片,基于数组切割，左包含，右不包含【左闭右开】
	arr := [...]int{1, 3, 5, 7, 9, 11, 13}
	s4 := arr[0:4]
	s5 := arr[0:]
	s6 := arr[:5]
	s7 := arr[:]
	fmt.Printf("s4: %v\n", s4) // s4: [1 3 5 7]
	fmt.Printf("s5: %v\n", s5) // s5: [1 3 5 7 9 11 13]
	fmt.Printf("s6: %v\n", s6) // s6: [1 3 5 7 9]
	fmt.Printf("s7: %v\n", s7) // s7: [1 3 5 7 9 11 13]
	// 切片的长度是指第一个元素到最后一个元素的元素数量 ，容量是指底层数组的容量
	fmt.Printf("len:%d cap:%d \n", len(s4), cap(s4)) // len:4 cap:7

	// 切片再切片
	s8 := s6[:3]
	fmt.Println("s6:", s6, "s8:", s8) //s6: [1 3 5 7 9] s8: [1 3 5]

	// 切片是引用类型
	s6[0] = 100
	fmt.Println("s6:", s6, "s8:", s8) //s6: [100 3 5 7 9] s8: [100 3 5]

}
